package org.dromara.workflow.flowable.config;

import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import org.dromara.workflow.flowable.handler.TaskTimeoutJobHandler;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.util.Collections;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：flowable配置
 */
/**
 * Flowable配置类，用于整合Flowable和Spring框架
 * 通过实现EngineConfigurationConfigurer接口，来配置SpringProcessEngineConfiguration类型的引擎配置
 */
@Configuration
public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {

    /**
     * 引擎调度监听
     */
    @Autowired
    private GlobalFlowableListener globalFlowableListener;

    /**
     * 注入一个标识符生成器，用于在服务层生成唯一的业务标识符
     */
    @Autowired
    private IdentifierGenerator identifierGenerator;

    /**
     * 配置SpringProcessEngineConfiguration的自定义设置
     * 此方法用于在流程引擎初始化时，设置全局的ID生成器、事件监听器以及自定义的Job处理器
     *
     * @param processEngineConfiguration 流程引擎配置对象，通过此对象可以配置全局的流程引擎行为
     */
    @Override
    public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
        // 设置流程实例和任务的ID生成策略，每次生成新的ID时，调用identifierGenerator.nextId方法
        processEngineConfiguration.setIdGenerator(() -> identifierGenerator.nextId(null).toString());

        // 设置全局事件监听器，用于监听流程中的各种事件
        processEngineConfiguration.setEventListeners(Collections.singletonList(globalFlowableListener));

        // 添加自定义的Job处理器，用于处理任务超时的情况
        processEngineConfiguration.addCustomJobHandler(new TaskTimeoutJobHandler());
    }
}
